package com.skyd.core.android;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import com.thoughtworks.xstream.XStream;
import com.thoughtworks.xstream.io.xml.DomDriver;

/**
 * 提供序列化功能
 * 
 * @author SkyD
 * 
 */
public final class Serialization {

	/**
	 * 序列化为XML字符串
	 * 
	 * @param obj
	 *            序列化对象
	 * @return XML字符串
	 */
	public static String toXMLString(Object obj) {
		return new XStream().toXML(obj);
	}

	/**
	 * 序列化到XML文件
	 * 
	 * @param obj
	 *            序列化对象
	 * @param path
	 *            文件路径
	 * @throws FileNotFoundException
	 *             文件未找到异常
	 */
	public static void toXMLFile(Object obj, String path)
			throws FileNotFoundException {
		toXMLStream(obj, new FileOutputStream(path));
	}

	/**
	 * 序列化到XML输出流
	 * 
	 * @param obj
	 *            序列化对象
	 * @param stream
	 *            输出流
	 */
	public static void toXMLStream(Object obj, OutputStream stream) {
		new XStream().toXML(obj, stream);
	}

	/**
	 * 反序列化自XML文件
	 * 
	 * @param <T>
	 *            对象类型
	 * @param path
	 *            文件路径
	 * @param rootobj
	 *            XML根节点对应的对象
	 * @return 反序列化得到的对象
	 * @throws FileNotFoundException
	 *             文件未找到异常
	 */
	public static <T> T formXMLFile(String path, T rootobj)
			throws FileNotFoundException {
		return formXMLStream(new FileInputStream(path), rootobj);
	}

	/**
	 * 反序列化自XML输入流
	 * 
	 * @param <T>
	 *            对象类型
	 * @param stream
	 *            输入流
	 * @param rootobj
	 *            XML根节点对应的对象
	 * @return 反序列化得到的对象
	 */
	public static <T> T formXMLStream(InputStream stream, T rootobj) {
		new XStream(new DomDriver()).fromXML(stream, rootobj);
		return rootobj;
	}

	/**
	 * 反序列化自XML文件
	 * 
	 * @param path
	 *            文件路径
	 * @return 反序列化得到的对象
	 * @throws FileNotFoundException
	 *             文件未找到异常
	 */
	public static Object formXMLFile(String path) throws FileNotFoundException {
		return formXMLStream(new FileInputStream(path));
	}

	/**
	 * 反序列化自XML输入流
	 * 
	 * @param stream
	 *            输入流
	 * @return 反序列化得到的对象
	 */
	public static Object formXMLStream(InputStream stream) {
		return new XStream(new DomDriver()).fromXML(stream);
	}

	/**
	 * 反序列化自XML字符串
	 * 
	 * @param <T>
	 *            对象类型
	 * @param xmlstring
	 *            字符串
	 * @param rootobj
	 *            XML根节点对应的对象
	 * @return 反序列化得到的对象
	 */
	public static <T> T formXMLString(String xmlstring, T rootobj) {
		new XStream(new DomDriver()).fromXML(xmlstring, rootobj);
		return rootobj;
	}

	/**
	 * 反序列化自XML字符串
	 * 
	 * @param xmlstring
	 *            字符串
	 * @return 反序列化得到的对象
	 */
	public static Object formXMLString(String xmlstring) {
		return new XStream(new DomDriver()).fromXML(xmlstring);
	}
}
